#ifndef DTU_MQTT_H
#define DTU_MQTT_H

#include "dtu_common.h"

/* MQTT消息结构 */
typedef struct {
    char topic[256];          /* 主题 */
    uint8_t* payload;         /* 消息内容 */
    size_t payload_length;    /* 消息长度 */
    mqtt_qos_t qos;          /* QoS级别 */
    bool retained;            /* 保留消息 */
    uint16_t message_id;      /* 消息ID */
} mqtt_message_t;

/* MQTT订阅结构 */
typedef struct mqtt_subscription {
    char topic[256];          /* 订阅主题 */
    mqtt_qos_t qos;          /* QoS级别 */
    void (*callback)(const mqtt_message_t* message, void* user_data);
    void* user_data;
    struct mqtt_subscription* next;
} mqtt_subscription_t;

/* MQTT统计信息 */
typedef struct {
    uint32_t messages_sent;   /* 发送消息数 */
    uint32_t messages_received; /* 接收消息数 */
    uint32_t bytes_sent;      /* 发送字节数 */
    uint32_t bytes_received;  /* 接收字节数 */
    uint32_t connect_count;   /* 连接次数 */
    uint32_t disconnect_count; /* 断开次数 */
    time_t last_connect_time; /* 最后连接时间 */
    time_t last_message_time; /* 最后消息时间 */
} mqtt_stats_t;

/* MQTT客户端结构 */
typedef struct {
    mqtt_config_t config;     /* MQTT配置 */
    int socket_fd;            /* 套接字文件描述符 */
    mqtt_state_t state;       /* 连接状态 */
    pthread_t client_thread;  /* 客户端线程 */
    pthread_mutex_t mutex;    /* 互斥锁 */
    bool initialized;         /* 初始化标志 */
    bool running;             /* 运行状态 */
    
    /* 订阅管理 */
    mqtt_subscription_t* subscriptions;
    
    /* 消息队列 */
    mqtt_message_t* send_queue;
    int queue_size;
    int queue_capacity;
    
    /* 统计信息 */
    mqtt_stats_t stats;
    
    /* 回调函数 */
    void (*connect_callback)(bool connected, void* user_data);
    void (*message_callback)(const mqtt_message_t* message, void* user_data);
    void* callback_user_data;
    
    /* 保活管理 */
    time_t last_ping_time;
    time_t last_pong_time;
    
    /* 消息ID管理 */
    uint16_t next_message_id;
} mqtt_client_t;

/* 函数声明 */

/**
 * @brief 初始化MQTT客户端
 * @param config MQTT配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_init(const mqtt_config_t* config);

/**
 * @brief 销毁MQTT客户端
 */
void dtu_mqtt_cleanup(void);

/**
 * @brief 连接MQTT服务器
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_connect(void);

/**
 * @brief 断开MQTT连接
 */
void dtu_mqtt_disconnect(void);

/**
 * @brief 发布消息
 * @param topic 主题
 * @param payload 消息内容
 * @param length 消息长度
 * @param qos QoS级别
 * @param retained 是否保留
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_publish(const char* topic, const void* payload, size_t length, 
                             mqtt_qos_t qos, bool retained);

/**
 * @brief 订阅主题
 * @param topic 主题
 * @param qos QoS级别
 * @param callback 消息回调函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_subscribe(const char* topic, mqtt_qos_t qos,
                               void (*callback)(const mqtt_message_t* message, void* user_data),
                               void* user_data);

/**
 * @brief 取消订阅
 * @param topic 主题
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_unsubscribe(const char* topic);

/**
 * @brief 获取连接状态
 * @return MQTT连接状态
 */
mqtt_state_t dtu_mqtt_get_state(void);

/**
 * @brief 检查是否已连接
 * @return true 已连接，false 未连接
 */
bool dtu_mqtt_is_connected(void);

/**
 * @brief 获取统计信息
 * @param stats 输出统计信息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_get_stats(mqtt_stats_t* stats);

/**
 * @brief 重置统计信息
 */
void dtu_mqtt_reset_stats(void);

/**
 * @brief 设置连接回调函数
 * @param callback 回调函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_set_connect_callback(void (*callback)(bool connected, void* user_data),
                                          void* user_data);

/**
 * @brief 设置消息回调函数
 * @param callback 回调函数
 * @param user_data 用户数据
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_set_message_callback(void (*callback)(const mqtt_message_t* message, void* user_data),
                                          void* user_data);

/**
 * @brief 更新MQTT配置
 * @param config 新的MQTT配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_update_config(const mqtt_config_t* config);

/**
 * @brief 获取当前MQTT配置
 * @param config 输出配置
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_get_config(mqtt_config_t* config);

/**
 * @brief 发送保活消息
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_ping(void);

/**
 * @brief 获取订阅列表
 * @param topics 输出主题数组
 * @param max_count 最大主题数量
 * @return 实际主题数量
 */
int dtu_mqtt_get_subscriptions(char topics[][256], int max_count);

/**
 * @brief 清空发送队列
 */
void dtu_mqtt_clear_queue(void);

/**
 * @brief 获取队列大小
 * @return 队列中的消息数量
 */
int dtu_mqtt_get_queue_size(void);

/**
 * @brief 重新连接
 * @return DTU_OK 成功，其他值失败
 */
dtu_error_t dtu_mqtt_reconnect(void);

/**
 * @brief 释放MQTT消息
 * @param message 消息结构
 */
void dtu_mqtt_free_message(mqtt_message_t* message);

/**
 * @brief QoS级别转换为字符串
 * @param qos QoS级别
 * @return QoS字符串
 */
const char* dtu_mqtt_qos_string(mqtt_qos_t qos);

/**
 * @brief 从字符串解析QoS级别
 * @param str QoS字符串
 * @return QoS级别
 */
mqtt_qos_t dtu_mqtt_qos_from_string(const char* str);

/**
 * @brief 连接状态转换为字符串
 * @param state 连接状态
 * @return 状态字符串
 */
const char* dtu_mqtt_state_string(mqtt_state_t state);

/* MQTT协议相关常量 */
#define MQTT_PROTOCOL_VERSION_3_1_1  4
#define MQTT_MAX_PACKET_SIZE         268435455
#define MQTT_KEEPALIVE_DEFAULT       60
#define MQTT_CONNECT_TIMEOUT         30
#define MQTT_RECONNECT_INTERVAL      5

/* MQTT消息类型 */
#define MQTT_MSG_CONNECT     1
#define MQTT_MSG_CONNACK     2
#define MQTT_MSG_PUBLISH     3
#define MQTT_MSG_PUBACK      4
#define MQTT_MSG_PUBREC      5
#define MQTT_MSG_PUBREL      6
#define MQTT_MSG_PUBCOMP     7
#define MQTT_MSG_SUBSCRIBE   8
#define MQTT_MSG_SUBACK      9
#define MQTT_MSG_UNSUBSCRIBE 10
#define MQTT_MSG_UNSUBACK    11
#define MQTT_MSG_PINGREQ     12
#define MQTT_MSG_PINGRESP    13
#define MQTT_MSG_DISCONNECT  14

#endif /* DTU_MQTT_H */
